home *** CD-ROM | disk | FTP | other *** search
/ 130 MIDI Tool Box / 130 MIDI Tool Box.iso / pc800 / pc800.c < prev    next >
Text File  |  1987-10-25  |  14KB  |  494 lines

  1. #include"\c\colors.h"
  2.  
  3. #include<stdarg.h>
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include<dos.h>
  7.  
  8. #define TRUE 1
  9. #define FASLE 0
  10.  
  11. /* PC800 : roland jx-8p programmer/sound librarian */
  12.  
  13. /*----- global variables -------------------------------------------*/
  14.  
  15.      char cr1[50]="(C)opyright 1987 BP MIDI Systems";
  16.      char cr2[50]="Written by Mike Partain";
  17.      char cr3[50]="6071 Heatherwood drive";
  18.      char cr4[50]="Alexandria, Virginia 22310";
  19.      char cr5[50]="portions copyright 1986 Borland";
  20.  
  21.      int midi_x_data[5][65];
  22.      int patch=0;
  23.  
  24.      int done,current_parm,cur_curs;
  25.  
  26.   char parm_name[59][13]={
  27. "","","","","","","","","","",
  28. "",
  29. "range","waveform","tune","lfo","env",
  30. "range","waveform","crossmod","tune","fine_tune","lfo","env",
  31. "","","",
  32. "dynamics","ENV mode",
  33. "dco-1","dco-2","env","dynamics","mode",
  34. "hpf","cutoff","res","lfo","env","key_follow","dynamics","mode",
  35. "level","dynamics",
  36. "mode",
  37. "waveform","delay_time","rate",
  38. "attack","decay","sustain","release","key_follow",
  39. "attack","decay","sustain","release","key_follow",
  40. "",
  41. "Env mode"};
  42.  
  43.  int parm_x[59]={         /* this defines where data will go  */
  44.                           /* the title will be 15 behind it  */
  45.                           /* a value of 0 indicates no data ! */
  46. 16,0,0,0,0,0,0,0,0,0,
  47. 0,
  48. 16,31,46,61,76,
  49. 16,31,46,61,76,16,31,
  50. 0,0,0,
  51. 16,31,
  52. 16,31,46,61,76,
  53. 16,31,46,61,76,16,31,46,
  54. 16,31,
  55. 16,
  56. 16,31,46,
  57. 16,31,46,61,76,
  58. 16,31,46,61,76,
  59. 0,
  60. 46};
  61.  int parm_y[59]={   /* this defines where data will go  */
  62.                           /* the title will be 15 behind it  */
  63.                           /* a value of 0 indicates no data ! */
  64. 4,0,0,0,0,0,0,0,0,0,
  65. 0,
  66. 6,6,6,6,6,
  67. 7,7,7,7,7,8,8,
  68. 0,0,0,
  69. 10,10,
  70. 11,11,11,11,11,
  71. 12,12,12,12,12,13,13,13,
  72. 15,15,
  73. 16,
  74. 18,18,18,
  75. 20,20,20,20,20,
  76. 21,21,21,21,21,
  77. 0,
  78. 15};
  79.  
  80. int parm_color[59]={
  81. white,white,white,white,white,white,white,white,white,white,
  82. 0,
  83. red,red,red,red,red,
  84. blue,blue,blue,blue,blue,blue,blue,
  85. 0,0,0,
  86. green,green,
  87. brown,brown,brown,brown,brown,
  88. magenta,magenta,magenta,magenta,magenta,magenta,magenta,magenta,
  89. cyan,cyan,
  90. white,
  91. brown,brown,brown,
  92. blue,blue,blue,blue,blue,
  93. magenta,magenta,magenta,magenta,magenta,
  94. 0,
  95. cyan};
  96.  
  97. char tittle[11][10]={"NAME","DCO-1","DCO-2","DCO","MIXER",
  98.                       "VCF","VCA","CHORUS","LFO","ENV-1","ENV-2"};
  99. int tittle_y[11]={4,6,7,10,11,12,15,16,18,20,21};
  100. int tittle_color[11]={white,red,blue,green,brown,magenta,cyan,white,
  101. brown,blue,magenta};
  102.  
  103. /*------------------------------------------------------------------*/
  104. midi_exclusive()
  105.  { int a,i,type;
  106.    a=rc_dta_wt();
  107.    type=rc_dta_wt();
  108.    for (i=1;i<=4;++i) a=rc_dta_wt();   /* junk <--- fix !! ---< */
  109.    if (type==0x35) {     /* APR */
  110.                     for (i=0;i<=58;++i) midi_x_data[patch][i]=rc_dta_wt();
  111.                     a=rc_dta_wt();
  112.                     if (a!=0xf7) xabort(5);
  113.                     else show_midi_x_data();
  114.                    }
  115.    else {               /* IPR */
  116.          if (type!=0x36) warning("type!=x35 or x36");
  117.          else  do {
  118.                    a=rc_dta_wt();
  119.                    if (a!=0xf7) {
  120.                        midi_x_data[patch][a]=rc_dta_wt();
  121.                        save_cursor();
  122.                        show_parm(a);
  123.                        restore_cursor();
  124.                                 }
  125.                   } while (a!=0xf7);
  126.         }
  127.  }
  128. /*------------------------------------------------------------------*/
  129. show_parm(a)
  130. int a;
  131. {
  132.  if (a<=9) show_name();
  133.  else {
  134.        if (parm_x[a]!=0) {
  135.            switch(a)
  136.         {  case (12):
  137.            case (17): special(a,"noi ","squ ","pul ","saw "); break;
  138.            case (11):
  139.            case (16): special(a,"16' "," 8' "," 4' "," 2' "); break;
  140.            case (27):
  141.            case (32):
  142.            case (40): env_mode(a); break;
  143.            case (26):
  144.            case (31):
  145.            case (39):
  146.            case (42):
  147.            case (51):
  148.            case (56): special(a,"off ","  1 ","  2 ","  3 ");break;
  149.            case (18): special(a,"off ","syn1","syn2","xmod");break;
  150.            case (58): special(a,"gate","gate","env2","env2");break;
  151.            case (44): special(a,"rnd ","sqr ","tri ","tri ");break;
  152.            case (43): special(a,"off ","  1 ","  2 ","  2 ");break;
  153.            case (33): special(a,"  0 ","  1 ","  2 ","  3 ");break;
  154.  
  155.  
  156.            default: { gotoxy(parm_x[a],parm_y[a]);
  157.                       color(parm_color[a]+bold);
  158.                       printf("%3d ",midi_x_data[patch][a]);
  159.                     }
  160.         }
  161.                          }
  162.       }
  163. }
  164. /*------------------------------------------------------------------*/
  165. special(a,p1,p2,p3,p4) int a; char *p1,*p2,*p3,*p4;
  166. {
  167.  gotoxy(parm_x[a],parm_y[a]);
  168.  color(parm_color[a]+bold);
  169.  if      (midi_x_data[patch][a]<=31)  printf("%4s",p1);
  170.  else if (midi_x_data[patch][a]<=63)  printf("%4s",p2);
  171.  else if (midi_x_data[patch][a]<=95)  printf("%4s",p3);
  172.  else if (midi_x_data[patch][a]<=127) printf("%4s",p4);
  173. }
  174. /*------------------------------------------------------------------*/
  175. env_mode(a)
  176. int a;
  177. {
  178.  gotoxy(parm_x[a],parm_y[a]);
  179.  color(parm_color[a]+bold);
  180.  if (midi_x_data[patch][a]<=31) printf(" 2%c",25);
  181.  else if (midi_x_data[patch][a]<=63) printf(" 2%c",24);
  182.  else if (midi_x_data[patch][a]<=95) printf(" 1%c",25);
  183.  else if (midi_x_data[patch][a]<=127) printf(" 1%c",24);
  184. }
  185. /*------------------------------------------------------------------*/
  186. draw_screen()
  187. {int i,x;
  188.  for (i=0;i<=10;++i) {
  189.         gotoxy(1,tittle_y[i]);
  190.         color(tittle_color[i]+bold);
  191.         printf("%s",tittle[i]);
  192.                      }
  193.  for (i=0;i<=58;++i) {
  194.         if (parm_x[i]!=0) {
  195.             x=parm_x[i]-strlen(parm_name[i])-1;
  196.             gotoxy(x,parm_y[i]);
  197.             color(parm_color[i]+bold);
  198.             printf("%s",parm_name[i]);
  199.                            }
  200.                      }
  201.  gotoxy(5,24); color(white+bold);
  202.  printf("F1 Save / F2 Load / F3 Dir / F4 Send / F5 Shell /");
  203.  printf("F6 Name / F10 Exit");
  204.  locate(25,26); color(white+bold);
  205.  printf("F7 Patch Up / F8 Patch Down");
  206.  locate(2,1);
  207.  color(green+bold);
  208.  printf("Current patch %d",patch+1);
  209.  color(normal);
  210. }
  211.  
  212. /*------------------------------------------------------------------*/
  213. show_midi_x_data()
  214. { int i;
  215.   save_cursor();
  216.   locate(2,1);
  217.   color(green+bold);
  218.   printf("Current patch %d",patch+1);
  219.   for (i=11;i<=58;++i) show_parm(i);
  220.   show_name();
  221.   restore_cursor();
  222.   mov_curs();
  223. }
  224. /*------------------------------------------------------------------*/
  225. show_name()
  226. {
  227.   int i;
  228.   save_cursor();
  229.   gotoxy(10,4); color(white+bold);
  230.   for (i=0;i<=9;i++)
  231.    if (midi_x_data[patch][i]!=0) printf("%c",midi_x_data[patch][i]); /* name */
  232.   restore_cursor();
  233. }
  234. /*------------------------------------------------------------------*/
  235. pffunc1()
  236. {
  237. }
  238. /*------------------------------------------------------------------*/
  239. func_key()
  240. {
  241.  char c;
  242.  c=getch();
  243.  switch (c) {
  244.   case (0x3b): save_patch(); break;
  245.   case (0x3c): load_patch(); break;
  246.   case (0x3d): patch_dir(); break;
  247.   case (0x3e): send_apr(); break;
  248.   case (0x3f): shell(); break;
  249.   case (0x40): new_name(); break;
  250.   case (0x41): patch_down(); break;
  251.   case (0x42): patch_up(); break;
  252.   case (0x43): pffunc1(); break;
  253.   case (0x44): quit(); break;
  254.   case (0x4d): parm_right(); break;
  255.   case (0x4b): parm_left(); break;
  256.   case (0x48): parm_up(); break;
  257.   case (0x50): parm_down(); break;
  258.   case (0x49): change_down(current_parm,5); break;
  259.   case (0x51): change_up(current_parm,5); break;
  260.   case (0x68): save_set(); break;
  261.   case (0x69): load_set(); break;
  262.   case (0x6a): set_dir(); break;
  263.             }
  264.  
  265. }
  266. /*------------------------------------------------------------------*/
  267. quit()
  268. {
  269.  char yn;
  270.  screen(1); cls();
  271.  printf("Are you sure you want to exit (Y/N)?");
  272.  yn=getch();
  273.  if (toupper(yn)=='Y') done=TRUE;
  274.  screen(0);
  275. }
  276. /*------------------------------------------------------------------*/
  277. patch_up()
  278. {
  279.  patch++;
  280.  if (patch>4) patch=0;
  281.  show_midi_x_data();
  282. }
  283. patch_down()
  284. {
  285.  patch--;
  286.  if (patch<0) patch=4;
  287.  show_midi_x_data();
  288. }
  289. /*------------------------------------------------------------------*/
  290. new_name()
  291. {
  292.  int i;
  293.  char name[11];
  294.  screen(1); cls();
  295.  for (i=0;i<=10;i++) name[i]=midi_x_data[patch][i];
  296.  name[10]='\0';
  297.  color(green+bold);
  298.  printf("Current name:%s\n",name);
  299.  color(yellow);
  300.  printf("Enter new name for patch?");
  301.  scanf("%s",name);
  302.  i=0;
  303.  while ((i<=10) & (name[i]!='\0'))
  304.   {
  305.    midi_x_data[patch][i]=toupper(name[i]);
  306.    ++i;                                          /* copy to brk */
  307.   }
  308. /* pad w/blanks */
  309.  if (i!=10) for (i=i;i<=10;i++) midi_x_data[patch][i]=' ';
  310.  
  311.  screen(0);
  312.  show_name();
  313. }
  314. /*------------------------------------------------------------------*/
  315. load_patch()
  316. {
  317.  int i;
  318.  int ok=FASLE;
  319.  FILE *fp, *fopen();
  320.  char *fn[20];
  321.  char *fe;
  322.  
  323.       screen(1); cls();
  324.       color(red+bold);
  325.       printf("\nLOAD");
  326.       color(blue);
  327.       printf(" - enter file name:");
  328.       scanf("%s",fn);
  329.       printf("\n");
  330.  
  331.       fe=".jx8";
  332.       strncat(fn,fe,20);
  333.  
  334.       if ((fp = fopen(fn, "r"))==NULL) {
  335.              color(red);
  336.              printf("bad open\n");
  337.                                     }
  338.       else     {
  339.                 i=0;
  340.                 while ((midi_x_data[patch][i++]=getc(fp))!=EOF);
  341.                 fclose(fp);
  342. /* design note 'i' = 60 because EOF was counted !!! */
  343.                 if (i!=60) {color(red); printf("bad data\n");}
  344.                 else {color(green); printf("load ok\n");ok=TRUE;}
  345.                }
  346.  wait_key();
  347.  screen(0);
  348.  if (ok) show_midi_x_data();
  349. }
  350. /*------------------------------------------------------------------*/
  351. save_patch()
  352. {
  353.  int a;
  354.  FILE *fp, *fopen();
  355.  char *fn[20];
  356.  char *fe;
  357.  
  358.       screen(1); cls();
  359.       color(red+bold);
  360.       printf("\nWrite");
  361.       color(blue);
  362.       printf(" - enter file name:");
  363.       scanf("%s",fn);
  364.       printf("\n");
  365.  
  366.       fe=".jx8";
  367.       strncat(fn,fe,20);
  368.  
  369.       if ((fp = fopen(fn, "w"))==NULL) {
  370.                 color(red+bold);
  371.                 printf("bad open\n");
  372.                                     }
  373.       else     {
  374.                 for (a=0;a<=58;a++) putc(midi_x_data[patch][a],fp);
  375.                 fclose(fp);
  376.                 color(green+bold);
  377.                 printf("write ok\n");
  378.                }
  379.  wait_key();
  380.  screen(0);
  381. }
  382. /*------------------------------------------------------------------*/
  383. send_ipr(parm) int parm;
  384. {
  385.  sn_cmd(0xdf);   /* want to send message */
  386.  sn_dta(0xf0); /* sys exclusive          */
  387.  sn_dta(0x41); /* roland id              */
  388.  sn_dta(0x36); /* IPR mode               */
  389.  sn_dta(0x00); /* channel                */
  390.  sn_dta(0x21); /* format type JX-8P      */
  391.  sn_dta(0x20); /* level #                */
  392.  sn_dta(0x01); /* group #                */
  393.  sn_dta(parm); /* parm to chnge          */
  394.  sn_dta(midi_x_data[patch][parm]); /* new value */
  395.  sn_dta(0xf7); /* end of ex data         */
  396. /* why couldn't mirage be that simple?!  */
  397. }
  398. /*------------------------------------------------------------------*/
  399. send_apr()
  400. {
  401.  int i;
  402.   sn_cmd(0xdf);   /* want to send message */
  403.  sn_dta(0xf0); /* sys exclusive          */
  404.  sn_dta(0x41); /* roland id              */
  405.  sn_dta(0x35); /* APR mode               */
  406.  sn_dta(0x00); /* channel                */
  407.  sn_dta(0x21); /* format type JX-8P      */
  408.  sn_dta(0x20); /* level #                */
  409.  sn_dta(0x01); /* group #                */
  410.  for (i=0;i<=58;i++) sn_dta(midi_x_data[patch][i]);
  411.  sn_dta(0xf7); /* end of ex data         */
  412. }
  413. /*------------------------------------------------------------------*/
  414. change_up(parm,amt) int amt,parm;
  415. {
  416.  if (midi_x_data[patch][parm]<127) {
  417.      switch (parm)  {
  418.        case(11):;   case(12):;
  419.        case(16):;   case(17):;   case(18):;
  420.        case(26):;   case(27):;   case(31):;
  421.        case(32):;   case(33):;   case(39):;
  422.        case(40):;   case(42):;   case(43):;
  423.        case(44):;   case(56):;
  424.        case(58):           /* they all fall to here */
  425.                    if (midi_x_data[patch][parm]<96)
  426.                        midi_x_data[patch][parm]+=32;
  427.                    break;
  428.        default:    midi_x_data[patch][parm]+=amt;
  429.                    break;
  430.                     }
  431.      if (midi_x_data[patch][parm]>127) midi_x_data[patch][parm]=127;
  432.      show_parm(parm);
  433.      send_ipr(parm);
  434.                             }
  435. }
  436. /*------------------------------------------------------------------*/
  437. change_down(parm,amt) int amt,parm;
  438. {
  439.  if (midi_x_data[patch][parm]>0) {
  440.      switch (parm)  {
  441.        case(11):;   case(12):;
  442.        case(16):;   case(17):;   case(18):;
  443.        case(26):;   case(27):;   case(31):;
  444.        case(32):;   case(33):;   case(39):;
  445.        case(40):;   case(42):;   case(43):;
  446.        case(44):;   case(56):;
  447.        case(58):           /* they all fall to here */
  448.                    if (midi_x_data[patch][parm]>31)
  449.                        midi_x_data[patch][parm]-=32;
  450.                    break;
  451.        default:    midi_x_data[patch][parm]-=amt;
  452.                    break;
  453.                     }
  454.      if (midi_x_data[patch][parm]<0) midi_x_data[patch][parm]=0;
  455.      show_parm(parm);
  456.      send_ipr(parm);
  457.                             }
  458. }
  459. /*------------------------------------------------------------------*/
  460. handle_kbd()
  461. {
  462.  char c;
  463.  c=getch();
  464.  switch (c) {
  465.    case(0): func_key(); break;
  466.    case(0x2d): change_down(current_parm,1); break;
  467.    case(0x2b): change_up(current_parm,1); break;
  468.             }
  469. }
  470. /*------------------------------------------------------------------*/
  471. main()
  472. {
  473.  logo();
  474.  open_midi();
  475.  /* set_uart(); */
  476.  sn_cmd(0x97);     /* exclusive to host on */
  477. /* for (i=0;i<=10000;i++) {for (j=0;j<=100;j++) {;} }  /* delay */ */
  478.  cls();
  479.  copy_right();
  480.  draw_screen();
  481.  done=FASLE;
  482.  current_parm=11;
  483.  cur_curs=0;
  484.  mov_curs();
  485.  
  486.  while (!done) receive_midi_packet();
  487.  
  488.  cls();
  489.  close_midi();
  490.  color(normal);
  491.  printf("\nNormal End.......\n");
  492.  exit(0);
  493. }
  494.